﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>#Warn - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The #Warn directive enables or disables warnings for specific conditions which may indicate an error, such as a typo or missing "global" declaration." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>#Warn</h1>

<p>启用或禁用特定条件下的警告, 这些条件可能会产生错误, 例如书写错误或缺少 "全局" 声明.</p>

<pre class="Syntax"><span class="func">#Warn</span> <span class="optional">WarningType, WarningMode</span></pre>

<h2 id="Parameters">参数</h2>
<dl>

  <dt>WarningType</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>

    <p>要启用或禁用的警告类型. 如果省略, 默认为 <i>All</i>.</p>
    <p id="VarUnset"><strong>VarUnset</strong>: 在脚本开始运行之前, 为每个从未以下列任何方式使用的变量的第一个引用显示一个警告:</p>
    <ul>
      <li>作为一个直接的, 非动态赋值的目标, 如 <code>MyVar := ""</code>.</li>
      <li>与<a href="../Variables.htm#ref">引用操作符</a>一起使用(例如 <code>&amp;MyVar</code>).</li>
      <li>直接传递给 <a href="IsSet.htm">IsSet</a>(例如 <code>IsSet(MyVar)</code>).</li>
    </ul>
    <p id="LocalSameAsGlobal"><strong>LocalSameAsGlobal</strong>: 在脚本开始运行之前, 为每个名称与全局变量相同但 <em>未声明</em> 的局部变量显示一个警告. 这是为了防止在试图访问全局变量之前, 忘记在函数中声明全局变量而导致的错误. 如果该变量确实是计划作为局部变量来使用, 那么可以使用诸如 <code>local x</code> 或 <code>static y</code> 这样的声明来抑制该警告.</p>
    <p>默认情况下, 这个警告是禁用的.</p>
    <pre>#Warn
g := 1
ShowG() {       <em>; 即使从未调用这个函数也会显示警告.</em>
    <em>;global g   ; &lt;-- 访问全局变量时需要这行.</em>
    g := 2
}
ShowG
MsgBox g  <em>; 没有声明, 上面赋值的是局部变量 "g".</em></pre>
    <p id="Unreachable"><strong>Unreachable</strong>: 在脚本开始运行之前, 对紧跟在同一嵌套层的 <code>Return</code>, <code>Break</code>, <code>Continue</code>, <code>Throw</code> 或 <code>Goto</code> 之后的每一行发出警告, 除非该行是一个标签的目标. 任何这样的行都不会被执行.</p>
    <p>如果代码的目的是不可到达的 - 例如, 如果使用 <code>return</code> 暂时禁用一个代码块, 或者通过注释的方式暂时禁用热键或热字符串 - 可以考虑把不可到达的代码也注释掉. 另外, 也可以通过在第一行不可到达的代码上方定义一个<a href="../misc/Labels.htm">标签</a>来抑制警告.</p>
    <p><strong>All</strong>: 将给定的 <em>WarningMode</em> 应用于所有支持的警告类型.</p>
  </dd>

  <dt>WarningMode</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>表示如何发送警告的值. 如果省略, 则默认为 <em>MsgBox</em>.</p>
    <p><strong>MsgBox</strong>: 显示一个描述警告的消息框. 请注意, 一旦消息框被删除, 脚本将照常继续.</p>
    <p><strong>StdOut</strong>: 将警告的描述发送到 <em>stdout</em>(程序的标准输出流), 以及文件名和行号. 这允许像 SciTE 这样的高级编辑器在不中断脚本的情况下捕获警告 - 用户可以在以后通过编辑器的输出窗格跳转到每个违规行.</p>
    <p><strong>OutputDebug</strong>: 将警告的描述发送到调试器上显示. 如果调试器不是活动的, 则没有效果. 有关详情, 请参阅 <a href="OutputDebug.htm">OutputDebug</a>.</p>
    <p><strong>Off</strong>: 禁用给定 <em>WarningType</em> 的警告.</p>
  </dd>

</dl>
<h2 id="Remarks">备注</h2>
	<p>默认情况下, 所有的警告都是启用的并且使用 MsgBox 模式, 除了 LocalSameAsGlobal, 它是禁用的.</p>
	<p>对产生 VarUnset, LocalSameAsGlobal 和 Unreachable 警告的检查是在所有指令被解析后, 但在脚本执行前进行的. 因此, 在脚本中的位置并不重要(而且, 像其他指令一样, #Warn 不能被有条件地执行).</p>
<p>然而, 多个 #Warn 指令的顺序是很重要的: 最后出现的设置给定警告的指令决定了该警告的模式.  因此, 例如, 下面两个语句的综合效果是启用除 LocalSameAsGlobal 以外的所有警告:</p>
<pre>#Warn All
#Warn LocalSameAsGlobal, Off
</pre>

<h2 id="Related">相关</h2>
<p><a href="../Functions.htm#Local">局部和全局变量</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExAllOff">
<p><a class="ex_number" href="#ExAllOff"></a> 禁用所有警告. 不推荐.</p>
<pre>#Warn All, Off</pre>
</div>

<div class="ex" id="ExOmitted">
<p><a class="ex_number" href="#ExOmitted"></a> 启用每种警告并将它们显示到消息框中.</p>
<pre>#Warn</pre>
</div>

<div class="ex" id="ExLSAGOutputDebug">
<p><a class="ex_number" href="#ExLSAGOutputDebug"></a> 对于每一个与全局变量同名的未声明的局部变量, 向 OutputDebug 发送一个警告.</p>
<pre>#Warn UseUnsetLocal, OutputDebug</pre>
</div>

</body>
</html>